<?php

/**
 * Classe per gestire le connessioni al database
 * @package    Adapter
 * @author    Domenico Biancardi <domenico.biancardi@gmail.com>
 * @link    http://code.google.com/p/syrius/
 *
 */
namespace Syrius\Adapter;

class Connection {

    /**
     * Lista delle connessioni attive a database
     * @var array
     */
    private static $_pool = array();

    /**
     * nome dell'ultima connessione che è stata usata o aggiunta
     * @var string
     */
    private static $_lastName;

    /**
     * Driver di connessione, in caso di default è Mysql
     * @var string
     */
    private static $_driver = "Mysql";

    /**
     * Imposta il driver di connessione da utilizzare
     * @param string $driverName
     */
    public static function setDriver($driverName = "Mysql") {
        self::$_driver = $driverName;
    }

    /**
     * * Aggiunge una nuova connessione al pool impostando un nome, questa funzione può essere richiamata in qualsiasi momento dato che è definita
     * come funzione statica.
     * Ecco un esempio;
     * Syrius_Adapter_Connection::addConnection("default", "localhost", "root");
     * @param string $name
     * @param string $host
     * @param string $username
     * @param string $passwd
     * @param string $dbname
     * @param int $port
     * @param int $socket
     * @param array $flags
     * @param array $options
     * @return driver
     * @access public
     * @static
     */
    public static function addConnection($name, $host, $username = "", $passwd = "", $dbname = "", $port = "", $socket = "", $flags = 0, $options = array()) {
        $driverName = "\\Syrius\\Adapter\\" . self::$_driver;
        $connection = new $driverName ($host, $username, $passwd);
        self::$_pool [$name] = $connection;
        self::$_lastName = $name;
        $charsetQuery = new \Syrius\Query\SetVariable_Charset ("UTF8");
        $query = new Query ($charsetQuery);
        return $connection;
    }

    /**
     * Chiude una connessione esistente dal pool se esiste altrimenti lancia un'eccezione
     * @param string $name
     */
    public static function removeConnection($name = "") {
        self::checkConnection($name);
        unset (self::$_pool [$name]);
    }

    /**
     * Ritorna la lista di connessioni attive
     * @return multitype:
     */
    public static function listConnections() {
        return array_keys(self::$_pool);
    }

    /**
     * Ritorna una connessione a partire dal nome, se non esiste lancia un'exception
     * @param string $name
     * @return multitype:
     */
    public static function getConnection($name = "default") {
        self::checkConnection($name);
        return self::$_pool [$name];
    }

    /**
     * @todo sviluppo futuro
     */
    public function ping() {
    }

    /**
     * Controlla l'esistenza della connessione, in caso negativo viene lanciata una Exception
     * @param string $name
     * @throws \Syrius\Exception\Connection_Not_Exists
     */
    public static function checkConnection($name) {
        if (!isset (self::$_pool [$name]))
            throw new \Syrius\Exception\Connection_Not_Exists ();
    }

    /**
     * Ritorna la connessione basata sul lastName
     * @return \Syrius\Adapter\Driver
     */
    public static function getCurrentConnection() {
        return self::$_pool [self::$_lastName];
    }

    /**
     * Cambia la connessione lastName
     * @param string $name
     */
    public static function switchConnection($name) {
        self::checkConnection($name);
        self::$_lastName = $name;
    }

}

?>